只适用于同步模式
单连接并发的同步服务器一般使用dispatch_mode = 3
调度请求分配到Worker
进程,底层实现使用了忙闲识别方式。
- 当
Worker
进程接收到请求回调onReceive
或onRequest
时,将Worker
进程的状态设置为BUSY
,这时Reactor
线程将不会再给当前的Worker
进程分配新的请求 - 当
Worker
进程处理完当前的请求后,将状态设置为IDLE
,这时Reactor
线程将会继续给当前的Worker
进程分配新请求
dispatch_mode = 3
忙闲分配模式,在极端情况下所有Worker
均处于BUSY
时,会退化为dispatch_mode = 1
轮询模式。无论Worker
进程处于闲还是忙的状态,都会分配到新请求。这样极端情况下,某些请求可能会无法被最快处理。使用dispatch_mode = 3
时,需要保证绝大部分时间有充足的空闲Worker
。
在1.9.24
版本中底层新增加了Stream
模式。将dispatch
的过程进行了逆转,Reactor
线程不再调度决定向哪个Worker
进程投递新请求,而是发起一个Stream
的Connect
到一个Unix Socket
端口。
- 空闲的
Worker
会Accept
连接,并接收Reactor
传递的新请求 Worker
进程处理请求期间不再Accept
,新请求将有其他Worker
进行处理Worker
进程完成请求处理后,直接使用Stream
的通道向对应的TCP
客户端连接发送结果数据,响应完毕后关闭Reactor
和Worker
之间的Stream
连接
新的Stream
模式使用配置dispatch_mode = 7
来设置开启。此模式的最大优势是:无论任何极端情况下,都可以保证请求会被最快被处理。
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
'dispatch_mode' => 7,
'worker_num' => 2,
));
$serv->on('receive', function (swoole_server $serv, $fd, $threadId, $data)
{
var_dump($data);
echo "#{$serv->worker_id}>> received length=" . strlen($data) . "\n";
});
$serv->start();